diff -Naur mosaic-ck/src/readPNG.c mosaic-ck.patched/src/readPNG.c
--- mosaic-ck/src/readPNG.c	2009-04-25 14:26:02.000000000 -0400
+++ mosaic-ck.patched/src/readPNG.c	2016-10-28 03:24:50.970270499 -0400
@@ -1,5 +1,3 @@
-/* Changes for Mosaic-CK (C)2009 Cameron Kaiser */
-
 /****************************************************************************
  * NCSA Mosaic for the X Window System                                      *
  * Software Development Group                                               *
@@ -96,7 +94,15 @@
     png_struct *png_ptr;
     png_info *info_ptr;
 
-    double screen_gamma;
+    png_uint_32 raw_width, raw_height, rowbytes;
+    int bit_depth, color_type, interlace_type, compression_type, filter_type;
+
+    png_uint_32 have_palette;
+    png_colorp palette;
+    int num_palette;
+    png_uint_16p hist = NULL;
+
+    double gamma, screen_gamma;
 
     png_byte *png_pixels=NULL, **row_pointers=NULL;
     int i, j;
@@ -117,9 +123,9 @@
         if(ret != 8)
             return 0;
         
-        ret = png_check_sig(buf, 8);
+        ret = png_sig_cmp(buf, 0, 8);
         
-        if(!ret)
+        if(ret)
             return(0);
     }
 
@@ -128,18 +134,20 @@
     rewind(infile);
 
         /* allocate the structures */
+    /*png_ptr = (png_struct *)malloc(sizeof(png_struct));*/
     png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
     if(!png_ptr)
         return 0;
 
-    info_ptr = (png_info *)malloc(sizeof(png_info));
+    /* initialize the structures */
+    info_ptr = png_create_info_struct(png_ptr);
     if(!info_ptr) {
-        png_destroy_read_struct(&png_ptr, NULL, NULL);
+        /*free(png_ptr);*/
         return 0;
     }
 
         /* Establish the setjmp return context for png_error to use. */
-    if (setjmp(png_ptr->jmpbuf)) {
+    if (setjmp(png_jmpbuf(png_ptr))) {
         
 #ifndef DISABLE_TRACE
         if (srcTrace) {
@@ -147,19 +155,26 @@
         }
 #endif
 
+        /*png_read_destroy(png_ptr, info_ptr, (png_info *)0); */
 	png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
 
         if(png_pixels != NULL)
             free((char *)png_pixels);
         if(row_pointers != NULL)
             free((png_byte **)row_pointers);
-	png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+                
+        /*free((char *)png_ptr);*/
+        free((char *)info_ptr);
         
         return 0;
     }
 
-        /* initialize the structure */
-    png_info_init(info_ptr);
+#ifdef SAM_NO
+    /* SWP -- Hopefully to fix cores on bad PNG files */
+    png_set_message_fn(png_ptr,png_get_msg_ptr(png_ptr),NULL,NULL); 
+#endif
+
+    /*png_read_init(png_ptr);*/
     
         /* set up the input control */
     png_init_io(png_ptr, infile);
@@ -169,20 +184,26 @@
     
         /* setup other stuff using the fields of png_info. */
     
-    *width = (int)png_ptr->width;
-    *height = (int)png_ptr->height;
+    png_get_IHDR(png_ptr, info_ptr, &raw_width, &raw_height, &bit_depth,
+                 &color_type, &interlace_type, &compression_type,
+                 &filter_type);
+    rowbytes = png_get_rowbytes(png_ptr, info_ptr);
+    have_palette = png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
+
+    *width = (int)raw_width;
+    *height = (int)raw_height;
 
 #ifndef DISABLE_TRACE
     if (srcTrace) {
-        fprintf(stderr,"\n\nBEFORE\nheight = %d\n", (int)png_ptr->width);
-        fprintf(stderr,"width = %d\n", (int)png_ptr->height);
-        fprintf(stderr,"bit depth = %d\n", info_ptr->bit_depth);
-        fprintf(stderr,"color type = %d\n", info_ptr->color_type);
-        fprintf(stderr,"compression type = %d\n", info_ptr->compression_type);
-        fprintf(stderr,"filter type = %d\n", info_ptr->filter_type);
-        fprintf(stderr,"interlace type = %d\n", info_ptr->interlace_type);
-        fprintf(stderr,"num colors = %d\n",info_ptr->num_palette);
-        fprintf(stderr,"rowbytes = %d\n", info_ptr->rowbytes);
+        fprintf(stderr,"\n\nBEFORE\nwidth = %d\n", *width);
+        fprintf(stderr,"height = %d\n", *height);
+        fprintf(stderr,"bit depth = %d\n", bit_depth);
+        fprintf(stderr,"color type = %d\n", color_type);
+        fprintf(stderr,"compression type = %d\n", compression_type);
+        fprintf(stderr,"filter type = %d\n", filter_type);
+        fprintf(stderr,"interlace type = %d\n", interlace_type);
+        fprintf(stderr,"num colors = %d\n", num_palette);
+        fprintf(stderr,"rowbytes = %d\n", rowbytes);
     }
 #endif
 
@@ -205,16 +226,16 @@
 #endif
 
         /* strip pixels in 16-bit images down to 8 bits */
-    if (info_ptr->bit_depth == 16)
+    if (bit_depth == 16)
         png_set_strip_16(png_ptr);
 
 
         /* If it is a color image then check if it has a palette. If not
            then dither the image to 256 colors, and make up a palette */
-    if (info_ptr->color_type==PNG_COLOR_TYPE_RGB ||
-        info_ptr->color_type==PNG_COLOR_TYPE_RGB_ALPHA) {
+    if (color_type==PNG_COLOR_TYPE_RGB ||
+        color_type==PNG_COLOR_TYPE_RGB_ALPHA) {
 
-        if(! (info_ptr->valid & PNG_INFO_PLTE)) {
+        if(!have_palette) {
 
 #ifndef DISABLE_TRACE
             if (srcTrace) {
@@ -232,9 +253,7 @@
 
                 /* this should probably be dithering to 
                    Rdata.colors_per_inlined_image colors */
-            png_set_dither(png_ptr, std_color_cube, 
-                           216, 
-                           216, NULL, 1);
+            png_set_quantize(png_ptr, std_color_cube, 216, 216, NULL, 1);
             
         } else {
 #ifndef DISABLE_TRACE
@@ -243,10 +262,9 @@
             }
 #endif
  
-            png_set_dither(png_ptr, info_ptr->palette, 
-                           info_ptr->num_palette,
-                           get_pref_int(eCOLORS_PER_INLINED_IMAGE), 
-                           info_ptr->hist, 1);
+            png_get_hIST(png_ptr, info_ptr, &hist);
+            png_set_quantize(png_ptr, palette, num_palette,
+                             get_pref_int(eCOLORS_PER_INLINED_IMAGE), hist, 1);
             
         }
     }
@@ -255,14 +273,14 @@
            small as they can. This expands pixels to 1 pixel per byte, and
            if a transparency value is supplied, an alpha channel is
            built.*/
-    if (info_ptr->bit_depth < 8)
+    if (bit_depth < 8)
         png_set_packing(png_ptr);
 
 
         /* have libpng handle the gamma conversion */
 
     if (get_pref_boolean(eUSE_SCREEN_GAMMA)) { /*SWP*/
-        if (info_ptr->bit_depth != 16) {  /* temporary .. glennrp */
+        if (bit_depth != 16) {  /* temporary .. glennrp */
             screen_gamma=(double)(get_pref_float(eSCREEN_GAMMA));
             
 #ifndef DISABLE_TRACE
@@ -270,13 +288,13 @@
                 fprintf(stderr,"screen gamma=%f\n",screen_gamma);
             }
 #endif
-            if (info_ptr->valid & PNG_INFO_gAMA) {
+            if (png_get_gAMA(png_ptr, info_ptr, &gamma)) {
 #ifndef DISABLE_TRACE
                 if (srcTrace) {
-                    printf("setting gamma=%f\n",info_ptr->gamma);
+                    printf("setting gamma=%f\n", gamma);
                 }
 #endif
-                png_set_gamma(png_ptr, screen_gamma, (double)info_ptr->gamma);
+                png_set_gamma(png_ptr, screen_gamma, gamma);
             }
             else {
 #ifndef DISABLE_TRACE
@@ -289,34 +307,39 @@
         }
     }
     
-    if (info_ptr->interlace_type)
+    if (interlace_type)
         png_set_interlace_handling(png_ptr);
 
     png_read_update_info(png_ptr, info_ptr);
     
+    png_get_IHDR(png_ptr, info_ptr, &raw_width, &raw_height, &bit_depth,
+                 &color_type, &interlace_type, &compression_type,
+                 &filter_type);
+    rowbytes = png_get_rowbytes(png_ptr, info_ptr);
+    have_palette = png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
+
 #ifndef DISABLE_TRACE
     if (srcTrace) {
-        fprintf(stderr,"\n\nAFTER\nheight = %d\n", (int)png_ptr->width);
-        fprintf(stderr,"width = %d\n", (int)png_ptr->height);
-        fprintf(stderr,"bit depth = %d\n", info_ptr->bit_depth);
-        fprintf(stderr,"color type = %d\n", info_ptr->color_type);
-        fprintf(stderr,"compression type = %d\n", info_ptr->compression_type);
-        fprintf(stderr,"filter type = %d\n", info_ptr->filter_type);
-        fprintf(stderr,"interlace type = %d\n", info_ptr->interlace_type);
-        fprintf(stderr,"num colors = %d\n",info_ptr->num_palette);
-        fprintf(stderr,"rowbytes = %d\n", info_ptr->rowbytes);
+        fprintf(stderr,"\n\nAFTER\nwidth = %d\n", *width);
+        fprintf(stderr,"height = %d\n", *height);
+        fprintf(stderr,"bit depth = %d\n", bit_depth);
+        fprintf(stderr,"color type = %d\n", color_type);
+        fprintf(stderr,"compression type = %d\n", compression_type);
+        fprintf(stderr,"filter type = %d\n", filter_type);
+        fprintf(stderr,"interlace type = %d\n", interlace_type);
+        fprintf(stderr,"num colors = %d\n",num_palette);
+        fprintf(stderr,"rowbytes = %d\n", rowbytes);
     }
 #endif
 
         /* allocate the pixel grid which we will need to send to 
            png_read_image(). */
-    png_pixels = (png_byte *)malloc(info_ptr->rowbytes * 
-                                    (*height) * sizeof(png_byte));
+    png_pixels = (png_byte *)malloc(rowbytes * (*height) * sizeof(png_byte));
     
 
     row_pointers = (png_byte **) malloc((*height) * sizeof(png_byte *));
     for (i=0; i < *height; i++)
-        row_pointers[i]=png_pixels+(info_ptr->rowbytes*i);
+        row_pointers[i]=png_pixels+(rowbytes*i);
 
     
         /* FINALLY - read the darn thing. */
@@ -325,13 +348,13 @@
     
         /* now that we have the (transformed to 8-bit RGB) image, we have
            to copy the resulting palette to our colormap. */
-    if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) {
-        if (info_ptr->valid & PNG_INFO_PLTE) {
+    if (color_type & PNG_COLOR_MASK_COLOR) {
+        if (have_palette) {
             
-            for (i=0; i < info_ptr->num_palette; i++) {
-                colrs[i].red = info_ptr->palette[i].red << 8;
-                colrs[i].green = info_ptr->palette[i].green << 8;
-                colrs[i].blue = info_ptr->palette[i].blue << 8;
+            for (i=0; i < num_palette; i++) {
+                colrs[i].red = palette[i].red << 8;
+                colrs[i].green = palette[i].green << 8;
+                colrs[i].blue = palette[i].blue << 8;
                 colrs[i].pixel = i;
                 colrs[i].flags = DoRed|DoGreen|DoBlue;
             }
@@ -366,7 +389,7 @@
 
         /* if there is an alpha channel, we have to get rid of it in the
            pixmap, since I don't do anything with it yet */
-    if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) {
+    if (color_type & PNG_COLOR_MASK_ALPHA) {
 
 #ifndef DISABLE_TRACE
         if (srcTrace) {
@@ -405,10 +428,14 @@
     free((png_byte **)row_pointers);
     
         /* clean up after the read, and free any memory allocated */
+    /*png_read_destroy(png_ptr, info_ptr, (png_info *)0);*/
+	png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
+    
 
-        /* free the structure */
-        png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-
+        /* free the structures */
+    /*free((char *)png_ptr);*/
+    free((char *)info_ptr);
+    
     return pixmap;
 }
 
